package com.renwen.sms.controller;

import com.renwen.sms.dto.AdminDto;
import com.renwen.sms.dto.StudentDto;
import com.renwen.sms.dto.TeacherDto;
import com.renwen.sms.entity.Admin;
import com.renwen.sms.entity.Student;
import com.renwen.sms.entity.Teacher;
import com.renwen.sms.service.LoginService;
import com.renwen.sms.util.Result;
import com.renwen.sms.util.VerifyCodeUtil;
import org.springframework.util.Base64Utils;

import org.springframework.web.bind.annotation.*;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 用户控制器
 */
@RestController
@CrossOrigin // 支持跨域访问
@RequestMapping("/login")
public class LoginController {
    @Resource
    private LoginService userService;

    // 获取验证码
    @GetMapping("/getCode")
    public String getCode(HttpServletRequest request) {
        try {
            // 1. 生成难码字符串
            String code = VerifyCodeUtil.generateVerifyCode();

            // 2. 把生成验证码字符串存入上下文环境中
            request.getServletContext().setAttribute("code", code);

            // 3. 通过字符串生成图片，放到内存中
            // 字节内存流
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            VerifyCodeUtil.outputImage(code, os);
            // 4. 把内存中的图片数据通过Base64进行加密,并返回
            return "data:image/png;base64," + Base64Utils.encodeToString(os.toByteArray());
        } catch (IOException e) {
            return null;
        }
    }

    /**
     * 学生登录
     */
    @PostMapping("/student")
    public Result login(Student student, String code, HttpServletRequest request) {
        try {
            // 1. 调用业务方法来进行登录处理
            StudentDto studentDto = userService.login(student, code, request);
            // 2. 返回相应的提示信息
            return new Result("登录成功！", studentDto);
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400,  e.getMessage());
        }
    }

    /**
     * 教师登录
     */
    @PostMapping("/teacher")
    public Result login(Teacher teacher, String code, HttpServletRequest request) {
        try {
            // 1. 调用业务方法来进行登录处理
            TeacherDto teacherDto = userService.login(teacher, code, request);
            // 2. 返回相应的提示信息
            return new Result("登录成功！", teacherDto);
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400, "登录失败！" + e.getMessage());
        }
    }

    /**
     * 管理员登录
     */
    @PostMapping("/admin")
    public Result login(Admin admin, String code, HttpServletRequest request) {
        try {
            // 1. 调用业务方法来进行登录处理
            AdminDto adminDto = userService.login(admin, code, request);
            // 2. 返回相应的提示信息
            return new Result("登录成功！", adminDto);
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400, "登录失败！" + e.getMessage());
        }
    }

    /**
     * 管理员密码修改
     */
    @PostMapping("/admin/update")
    public Result updatePassword1(String pass,String newPass,String adNo) {
        try {
            // 1. 调用业务方法来进行登录处理
            userService.updatePassword1(pass,newPass,adNo);
            // 2. 返回相应的提示信息
            return new Result(200,"密码修改成功！");
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400, e.getMessage());
        }
    }
    /**
     * 学生密码修改
     */
    @PostMapping("/student/update")
    public Result updatePassword2(String pass,String newPass,String id) {
        try {
            // 1. 调用业务方法来进行登录处理
            System.out.println(pass+"---"+newPass+"="+id);
            userService.updatePassword2(pass,newPass,id);
            // 2. 返回相应的提示信息
            return new Result(200,"密码修改成功！");
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400, e.getMessage());
        }
    }
    /**
     * 教师密码修改
     */
    @PostMapping("/teacher/update")
    public Result login(String pass,String newPass,String id) {
        try {
            // 1. 调用业务方法来进行登录处理
            userService.updatePassword3(pass,newPass,id);
            // 2. 返回相应的提示信息
            return new Result(200,"密码修改成功！");
        } catch (Exception e) {
            // 3. 返回相应的提示信息
            return new Result(400, e.getMessage());
        }
    }
}
